﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection.Metadata;
using System.Reflection.PortableExecutable;
using System.Text;
using System.Threading.Tasks;
using zuJianClient.Enum;

namespace zuJianClient.PacketDto
{
    /// <summary>
    /// 人员特征信息回包[845]
    /// </summary>
    public class EmpInfo
    {
        /// <summary>
        /// 工人编号 (4 字节)
        /// </summary>
        public uint WorkerNumber { get; set; }

        /// <summary>
        /// 姓名 (30 字节，UTF-8 编码)
        /// </summary>
        public string Name { get; set; }

        /// <summary>
        /// 身份证号码 (18 字节，ASCII 编码)
        /// </summary>
        public string IDNumber { get; set; }

        /// <summary>
        /// 民族代号 (1 字节，HEX 编码)
        /// </summary>
        public Ethnicity Ethnicity { get; set; }

        /// <summary>
        /// 性别（1：男；0：女）(2 字节，ASCII 编码)
        /// </summary>
        public string Gender { get; set; }

        /// <summary>
        /// 身份证地址 (140 字节，UTF-8 编码)
        /// </summary>
        public string IDAddress { get; set; }

        /// <summary>
        /// 出生年月日（yyyyMMdd）(16 字节，ASCII 编码)
        /// </summary>
        public string DateOfBirth { get; set; }

        /// <summary>
        /// 发证机关 (60 字节，UTF-8 编码)
        /// </summary>
        public string IssuingAuthority { get; set; }

        /// <summary>
        /// 有效期 (64 字节，UTF-8 编码)
        /// </summary>
        public string ExpiryDate { get; set; }

        /// <summary>
        /// 采集照片长度 (4 字节)
        /// </summary>
        public uint CollectedPhotoLength { get; set; }

        /// <summary>
        /// 采集照片 (长度由 CollectedPhotoLength 决定)
        /// </summary>
        public byte[] CollectedPhoto { get; set; }

        /// <summary>
        /// 身份证照片长度 (4 字节)
        /// </summary>
        public uint IDPhotoLength { get; set; }

        /// <summary>
        /// 身份证照片 (长度由 IDPhotoLength 决定)
        /// </summary>
        public byte[] IDPhoto { get; set; }

        /// <summary>
        /// 红外照片长度（可为0） (4 字节)
        /// </summary>
        public uint InfraredPhotoLength { get; set; }

        /// <summary>
        /// 红外照片 (长度由 InfraredPhotoLength 决定)
        /// </summary>
        public byte[] InfraredPhoto { get; set; }

        /// <summary>
        /// 校验和 (1 字节，HEX 编码)
        /// </summary>
        public string Checksum { get; set; }

        public static class PacketParser
        {
            /// <summary>
            /// 从十六进制字符串解析对象
            /// </summary>
            /// <param name="hexString"></param>
            /// <returns></returns>
            public static EmpInfo ParseEmpInfoFromHex(string hexString)
            {
                if (string.IsNullOrEmpty(hexString) || hexString.Length % 2 != 0)
                    throw new ArgumentException("Invalid hex string.");

                var bytes = StringToByteArray(hexString);
                int currentIndex = 0;

                // 读取指定字节数并递增索引的辅助函数
                byte[] ReadBytes(int count)
                {
                    byte[] result = new byte[count]; // 按指定长度创建新字节数组
                    Array.Copy(bytes, currentIndex, result, 0, count); // 复制指定长度的字节
                    currentIndex += count;
                    return result;
                }

                EmpInfo empInfo = new EmpInfo();
                // 解析工作者编号（4 个字节）
                empInfo.WorkerNumber = BitConverter.ToUInt32(ReadBytes(4));
                // 解析工作者名称（10 字节）
                empInfo.Name = Encoding.UTF8.GetString(ReadBytes(30)).TrimEnd('\0');
                // 解析 ID 号（18 个字节）
                empInfo.IDNumber = Encoding.ASCII.GetString(ReadBytes(18)).TrimEnd('\0');
                // 解析民族代号（1 个字节）
                empInfo.Ethnicity = (Ethnicity)BitConverter.ToUInt32(ReadBytes(1));
                // 解析性别（2 个字节）
                empInfo.Gender = Encoding.ASCII.GetString(ReadBytes(2)).TrimEnd('\0');
                // 解析身份证地址（140 个字节）
                empInfo.IDAddress = Encoding.UTF8.GetString(ReadBytes(140)).TrimEnd('\0');
                // 解析出生年月日（16 个字节）
                empInfo.DateOfBirth = Encoding.ASCII.GetString(ReadBytes(16)).TrimEnd('\0');
                // 解析发证机关（60 个字节）
                empInfo.IssuingAuthority = Encoding.UTF8.GetString(ReadBytes(60)).TrimEnd('\0');
                // 解析有效期（64 个字节）
                empInfo.ExpiryDate = Encoding.UTF8.GetString(ReadBytes(64)).TrimEnd('\0');
                // 解析采集照片长度（4 个字节）
                empInfo.CollectedPhotoLength = BitConverter.ToUInt32(ReadBytes(4));
                // 解析采集照片
                empInfo.CollectedPhoto = ReadBytes((int)empInfo.CollectedPhotoLength);
                // 解析身份证照片长度（4 个字节）
                empInfo.IDPhotoLength = BitConverter.ToUInt32(ReadBytes(4));
                // 解析身份证照片
                empInfo.IDPhoto = ReadBytes((int)empInfo.IDPhotoLength);
                // 解析红外照片长度（4 个字节）
                empInfo.InfraredPhotoLength = BitConverter.ToUInt32(ReadBytes(4));
                // 解析红外照片
                empInfo.InfraredPhoto = ReadBytes((int)empInfo.InfraredPhotoLength);
                // 解析校验和（1 个字节）
                empInfo.Checksum = BitConverter.ToString(ReadBytes(1));
                return empInfo;
            }
        }
    }

    /// <summary>   
    /// 获取人员特征信息[845]
    /// </summary>
    public class PersonnelInfoCmd
    {
        /// <summary>
        /// 设备的唯一标识码  32字节 ASCII
        /// </summary>
        public string DeviceId { get; set; } = string.Empty;

        /// <summary>
        /// 身份证 18字节 ASCII
        /// </summary>
        public string IdentityCard { get; set; } = string.Empty;

        /// <summary>
        /// 校验和 1字节
        /// </summary>
        public byte CheckSum { get; set; }

        /// <summary>
        /// 将对象转换为十六进制字符串
        /// </summary>
        /// <returns></returns>
        public string ToHexString()
        {
            // 将字符串转换为字节数组
            byte[] deviceIdBytes = Encoding.ASCII.GetBytes(DeviceId);
            byte[] identityCardBytes = Encoding.ASCII.GetBytes(IdentityCard);

            // 确保字节数组的长度符合预期
            deviceIdBytes = EnsureLength(deviceIdBytes, 32);
            identityCardBytes = EnsureLength(identityCardBytes, 18);

            // 计算校验和
            byte checksum = CalculateChecksum(DeviceId + IdentityCard);

            // 将字节数组转换为十六进制字符串
            string deviceIdHex = BitConverter.ToString(deviceIdBytes).Replace("-", "");
            string identityCardHex = BitConverter.ToString(identityCardBytes).Replace("-", "");

            // 返回完整的十六进制字符串
            return deviceIdHex + identityCardHex + checksum.ToString("X2");
        }

        /// <summary>
        /// 对象转换为字节数组
        /// </summary>
        /// <param name="hex"></param>
        /// <returns></returns>
        public byte[] ToByteArray()
        {
            return Convert.FromHexString(ToHexString());
        }
    }
}
